home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmiSoft / Dev / misc / WHDLoad_dev.lha / WHDLoad / Src / programs / CRC16.asm < prev    next >
Encoding:
Assembly Source File  |  2003-12-08  |  6.6 KB  |  319 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    CRC16.asm
  3. ;  :Contents.    calculate CRC16 checksum
  4. ;  :Author.    Bert Jahn
  5. ;  :EMail.    wepl@whdload.de
  6. ;  :Address.    Clara-Zetkin-Straße 52, Zwickau, 08058, Germany
  7. ;  :Version.    $Id: CRC16.asm 1.1 2003/12/08 15:32:03 wepl Exp wepl $
  8. ;  :History.    08.12.03 started
  9. ;  :Requires.    OS V37+
  10. ;  :Copyright.    Public Domain
  11. ;  :Language.    68000 Assembler
  12. ;  :Translator.    Barfly V2.16
  13. ;---------------------------------------------------------------------------*
  14. ;##########################################################################
  15.  
  16.     INCDIR    Includes:
  17.     INCLUDE    lvo/exec.i
  18.     INCLUDE    exec/execbase.i
  19.     INCLUDE    exec/memory.i
  20.     INCLUDE    lvo/dos.i
  21.     INCLUDE    dos/dos.i
  22.  
  23.     INCLUDE    macros/ntypes.i
  24.  
  25. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  26.  
  27. GL    EQUR    A4        ;a4 ptr to Globals
  28. LOC    EQUR    A5        ;a5 for local vars
  29.  
  30.     STRUCTURE    ReadArgsArray,0
  31.         ULONG    rda_file
  32.         ULONG    rda_offset
  33.         ULONG    rda_length
  34.         LABEL    rda_SIZEOF
  35.  
  36.     NSTRUCTURE    Globals,0
  37.         NAPTR    gl_execbase
  38.         NAPTR    gl_dosbase
  39.         NULONG    gl_rc
  40.         NAPTR    gl_rdargs
  41.         NSTRUCT    gl_rdarray,rda_SIZEOF
  42.         NSTRUCT    gl_crc,256*2
  43.         NALIGNLONG
  44.         NLABEL    gl_SIZEOF
  45.  
  46. ;##########################################################################
  47.  
  48.     PURE
  49.     SECTION    "",CODE
  50.     OUTPUT    C:CRC16
  51.     BOPT    O+        ;enable optimizing
  52.     BOPT    OG+        ;enable optimizing
  53.     BOPT    ODd-        ;disable mul optimizing
  54.     BOPT    ODe-        ;disable mul optimizing
  55.     BOPT    wo-        ;no optimize warnings
  56.  
  57. VER    MACRO
  58.         dc.b    "CRC16 1.1 "
  59.     DOSCMD    "WDate >t:date"
  60.     INCBIN    "t:date"
  61.         dc.b    " by Bert Jahn"
  62.     ENDM
  63.  
  64.         bra    .start
  65.         dc.b    "$VER: "
  66.         VER
  67.         dc.b    " V37+"
  68.     CNOP 0,2
  69. .start
  70.  
  71. ;##########################################################################
  72.  
  73.         link    GL,#gl_SIZEOF        ;GL = PubMem
  74.         move.l    (4),(gl_execbase,GL)
  75.         clr.l    (rda_offset+gl_rdarray,GL)
  76.         clr.l    (rda_length+gl_rdarray,GL)
  77.         move.l    #RETURN_FAIL,(gl_rc,GL)
  78.  
  79.         move.l    #37,d0
  80.         lea    (_dosname),a1
  81.         move.l    (gl_execbase,GL),a6
  82.         jsr    _LVOOpenLibrary(a6)
  83.         move.l    d0,(gl_dosbase,GL)
  84.         beq    .nodoslib
  85.  
  86.         lea    (_ver),a0
  87.         bsr    _Print
  88.  
  89.         lea    (_template),a0
  90.         move.l    a0,d1
  91.         lea    (gl_rdarray,GL),a0
  92.         move.l    a0,d2
  93.         moveq    #0,d3
  94.         move.l    (gl_dosbase,GL),a6
  95.         jsr    (_LVOReadArgs,a6)
  96.         move.l    d0,(gl_rdargs,GL)
  97.         bne    .argsok
  98.         lea    (_readargs),a0
  99.         bsr    _PrintErrorDOS
  100.         bra    .noargs
  101. .argsok
  102.         move.l    (gl_rdarray+rda_offset,GL),d0
  103.         beq    .offset_ok
  104.         move.l    d0,a0
  105.         bsr    _etoi
  106.         tst.b    (a0)
  107.         bne    .a_badnum
  108.         move.l    d0,(gl_rdarray+rda_offset,GL)
  109. .offset_ok
  110.         move.l    (gl_rdarray+rda_length,GL),d0
  111.         beq    .a_ok
  112.         move.l    d0,a0
  113.         bsr    _etoi
  114.         tst.b    (a0)
  115.         bne    .a_badnum
  116.         move.l    d0,(gl_rdarray+rda_length,GL)
  117.         bra    .a_ok
  118.  
  119. .a_badnum    moveq    #ERROR_BAD_NUMBER,d1
  120.         moveq    #0,d2
  121.         jsr    (_LVOPrintFault,a6)
  122.         bra    .opend
  123. .a_ok
  124.         bsr    _Main
  125. .opend
  126.         move.l    (gl_rdargs,GL),d1
  127.         move.l    (gl_dosbase,GL),a6
  128.         jsr    (_LVOFreeArgs,a6)
  129. .noargs
  130.         move.l    (gl_dosbase,GL),a1
  131.         move.l    (gl_execbase,GL),a6
  132.         jsr    (_LVOCloseLibrary,a6)
  133. .nodoslib
  134.         move.l    (gl_rc,GL),d0
  135.         unlk    GL
  136.         rts
  137.  
  138. ;##########################################################################
  139.  
  140.     NSTRUCTURE    LocalMain,0
  141.         NALIGNLONG
  142.         NLABEL    lm_SIZEOF
  143.  
  144. _Main        move.l    (gl_rdarray+rda_file,GL),d1    ;name
  145.         move.l    #MODE_OLDFILE,d2        ;mode
  146.         move.l    (gl_dosbase,GL),a6
  147.         jsr    (_LVOOpen,a6)
  148.         move.l    d0,d7                ;D7 = fh
  149.         bne    .openok
  150.         lea    (_readfile),a0
  151.         bsr    _PrintErrorDOS
  152.         bra    .erropen
  153. .openok
  154.         move.l    d7,d1                ;fh
  155.         moveq    #0,d2                ;offset
  156.         move.l    #OFFSET_END,d3            ;mode
  157.         jsr    (_LVOSeek,a6)
  158.         tst.l    d0
  159.         bmi    .seekerr
  160.         move.l    d7,d1                ;fh
  161.         moveq    #0,d2                ;offset
  162.         move.l    #OFFSET_BEGINNING,d3        ;mode
  163.         jsr    (_LVOSeek,a6)
  164.         move.l    d0,d5                ;D5 = ULONG file size
  165.         bhi    .seekok
  166. .seekerr    lea    (_seekfile),a0
  167.         bsr    _PrintErrorDOS
  168.         bra    .errseek
  169. .seekok
  170.         cmp.l    (gl_rdarray+rda_offset,GL),d5
  171.         bls    .erroffset
  172.         move.l    (gl_rdarray+rda_length,GL),d0
  173.         beq    .length_ok
  174.         add.l    (gl_rdarray+rda_offset,GL),d0
  175.         cmp.l    d0,d5
  176.         blo    .errlength
  177. .length_ok
  178.         move.l    d5,d0
  179.         sub.l    (gl_rdarray+rda_offset,GL),d0
  180.         move.l    (gl_rdarray+rda_length,GL),d1
  181.         beq    .size_ok
  182.         move.l    d1,d0
  183. .size_ok    move.l    d0,d4                ;D4 = ULONG check size
  184.         move.l    #MEMF_ANY,d1
  185.         move.l    (gl_execbase,GL),a6
  186.         jsr    (_LVOAllocVec,a6)
  187.         move.l    d0,d6                ;D6 = APTR buffer
  188.         beq    .errmem
  189.  
  190.         move.l    d7,d1                ;fh
  191.         move.l    (gl_rdarray+rda_offset,GL),d2    ;offset
  192.         move.l    #OFFSET_BEGINNING,d3        ;mode
  193.         move.l    (gl_dosbase,GL),a6
  194.         jsr    (_LVOSeek,a6)
  195.         tst.l    d0
  196.         bpl    .seek_ok
  197.         lea    (_readfile),a0
  198.         bsr    _PrintErrorDOS
  199.         bra    .errseek2
  200. .seek_ok
  201.         move.l    d7,d1                ;fh
  202.         move.l    d6,d2                ;buffer
  203.         move.l    d4,d3                ;length
  204.         jsr    (_LVORead,a6)
  205.         cmp.l    d4,d0
  206.         beq    .readok
  207.         lea    (_readfile),a0
  208.         bsr    _PrintErrorDOS
  209.         bra    .errread
  210. .readok
  211.         move.l    d4,d1
  212.         move.l    d6,a0
  213.         bsr    _CRC16
  214.         move.l    d0,(gl_rc,GL)
  215.         lea    (_msg),a0
  216.         move.l    d0,-(a7)
  217.         move.l    d0,-(a7)
  218.         move.l    d4,-(a7)
  219.         move.l    d4,-(a7)
  220.         move.l    (gl_rdarray+rda_offset,GL),-(a7)
  221.         move.l    (gl_rdarray+rda_offset,GL),-(a7)
  222.         move.l    (gl_rdarray+rda_file,GL),-(a7)
  223.         move.l    a7,a1
  224.         bsr    _PrintArgs
  225.         add.w    #7*4,a7
  226. .errread
  227. .errseek2
  228.         move.l    d6,a1
  229.         move.l    (gl_execbase,GL),a6
  230.         jsr    (_LVOFreeVec,a6)
  231.         bra    .errseek
  232.  
  233. .errmem        lea    (_nomem),a0
  234.         bra    .err
  235. .errlength    lea    (_badlength),a0
  236.         bra    .err
  237. .erroffset    lea    (_badoffset),a0
  238. .err        moveq    #0,d0
  239.         lea    (_readfile),a1
  240.         bsr    _PrintError
  241. .errseek        
  242.         move.l    d7,d1            ;fh
  243.         move.l    (gl_dosbase,GL),a6
  244.         jsr    (_LVOClose,a6)
  245. .erropen
  246.         rts
  247.  
  248. ;---------------------------------------------------------------------------*
  249. ; ANSI CRC16
  250. ; IN:    d0 = ULONG length
  251. ;    a0 = APTR  address
  252. ; OUT:    d0 = UWORD crc checksum
  253.  
  254. _CRC16        movem.l    d2-d3,-(a7)
  255.  
  256.     ;calculate crc-table
  257.         lea    (gl_crc,GL),a1
  258.         moveq    #0,d3
  259. .crc2        move.l    d3,d1
  260.         moveq    #7,d2
  261. .crc3        lsr.w    #1,d1
  262.         bcc    .crc4
  263.         eor.w    #$a001,d1
  264. .crc4        dbf    d2,.crc3
  265.         move.w    d1,(a1)+
  266.         addq.b    #1,d3
  267.         bne    .crc2
  268.  
  269.         move.l    d0,d1
  270.         beq    .end
  271.         moveq    #0,d0
  272.         moveq    #0,d2
  273.         lea    (gl_crc,GL),a1
  274.  
  275. .loop        moveq    #0,d2
  276.         move.b    (a0)+,d2
  277.         eor.b    d0,d2
  278.         lsr.w    #8,d0
  279.         add.w    d2,d2
  280.         move.w    (a1,d2.w),d3
  281.         eor.w    d3,d0
  282.         subq.l    #1,d1
  283.         bne    .loop
  284.  
  285. .end        movem.l    (a7)+,_MOVEMREGS
  286.         rts
  287.  
  288. ;##########################################################################
  289.  
  290.     INCDIR    Sources:
  291.     INCLUDE    error.i
  292.         PrintErrorDOS
  293.     INCLUDE    strings.i
  294.         Print
  295.         etoi
  296.  
  297. ;##########################################################################
  298.  
  299. _msg        dc.b    "File '%s' Offset=$%lx=%ld Length=$%lx=%ld CRC16=$%lx=%ld",10,0
  300. _readargs    dc.b    "read arguments",0
  301. _readfile    dc.b    "read file",0
  302. _seekfile    dc.b    "seek file",0
  303. _badoffset    dc.b    "offset is outside the file",0
  304. _badlength    dc.b    "length is larger than file",0
  305. _nomem        dc.b    "not enough memory",0
  306. _dosname    dc.b    "dos.library",0
  307. _template    dc.b    "FILE/A"        ;file name
  308.         dc.b    ",OFFSET/K"        ;offset read from
  309.         dc.b    ",LENGTH/K"        ;data length for crc
  310.         dc.b    0
  311.  
  312. _ver        VER
  313.         dc.b    10,0
  314.  
  315. ;##########################################################################
  316.  
  317.     END
  318.  
  319.